/**
 * Copyright (2017, ) Institute of Software, Chinese Academy of Sciences
 * Copyright (2017, ) Bocloud Co,. Lmt
 */
package cn.abcsys.devops.core.runtime;

/**
 * @author wuheng@{otcaix.iscsa.ac.cn,beyondcent.com}
 * @date   May 19, 2017
 *
 * <code>Host<code>实例运行的载体，只能归属于一个集群
 */
public interface Host {

	/************************************************
	 * 
	 *                 基本功能
	 *
	 ************************************************/
	/**
	 * 添加到指定集群
	 * 
	 * @param hosts
	 * @return
	 * @throws Exception
	 */
	public Object addTo(Cluster cluster) throws Exception;
	
	/**
	 * 从指定集群中删除
	 * 
	 * @param cluster
	 * @return
	 * @throws Exception
	 */
	public Object removeFrom(Cluster cluster) throws Exception;
	
	
	/**
	 * 获取所在集群
	 * 
	 * @return
	 */
	public Cluster getOwnedCluster();
	
	/**
	 * 获取主机信息
	 * 
	 * @return
	 */
	public Object getHostInfo();
	
	/**
	 * 返回主机类型
	 * 
	 * @return
	 */
	public Host.Type getHostType();
	
	/**
	 * 返回主机状态
	 * 
	 * @return
	 */
	public Host.Status getHostStatus();
	
	/************************************************
	 * 
	 *                 高级功能
	 *
	 ************************************************/
	
	/**
	 * 获取主机唯一标识符
	 * 
	 * @return
	 */
	public String getUUID();
	
	/**
	 * 获取访问入口
	 * 
	 * @return
	 */
	public String getUrl();
	
	
	/************************************************
	 * 
	 *                 辅助功能
	 *
	 ************************************************/
	/**
	 * 主机类型
	 * 
	 * @author wuheng@{otcaix.iscsa.ac.cn,beyondcent.com}
	 * @date   May 19, 2017
	 *
	 */
	public static enum Type {
		/**
		 * 持续集成工作机
		 */
		TOOLKIT,
		/**
		 * 硬件，如F5
		 * 直接使用
		 */
		HARDWARE,
		/**
		 * 物理主机/虚拟主机
		 * 必须归属于MESOS集群
		 */
		NATIVE,
		/**
		 * 容器
		 * 必须归属KUBERNETS或SWARM集群才能使用
		 */
		CONTAINER
	}
	
	/**
	 * 主机状态
	 * 
	 * @author wuheng@{otcaix.iscsa.ac.cn,beyondcent.com}
	 * @date   May 19, 2017
	 *
	 */
	public static enum Status {
		/**
		 * 连接中状态，比如添加主机，会对主机环境进行检查的时间
		 */
		CONNECTING,
		/**
		 * 已连接状态，此状态下可以对外提供服务
		 */
		CONNECTED,
		/**
		 * 取消连接状态，导致此状态的原因可能是关机、网络等原因
		 */
		DISCONNECTED
	}
}
